/**
 * PanelRegistroNotas.java
 */

 /**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.presentacion;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
import java.util.Calendar;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import adsec.entidades.Acta;
import adsec.entidades.Anio;
import adsec.entidades.Docente;
import adsec.entidades.Estado;
import adsec.entidades.GridRegistroNotasPeriodo;
import adsec.entidades.InfoPeriodoActa;
import adsec.entidades.LlaveValor;
import adsec.entidades.MateriaCursada;
import adsec.entidades.Nivel;
import adsec.entidades.NotasPeriodoActa;
import adsec.entidades.Perfil;
import adsec.entidades.Permiso;
import adsec.entidades.Seccion;
import adsec.negocios.AdministradorSeguridad;
import adsec.negocios.ControladoraRegistroNotas;
import adsec.negocios.UtilidadesCapaNegocios;
import org.jdesktop.application.Action;


public class PanelRegistroNotas extends javax.swing.JPanel implements ActionListener, TableModelListener{

    private AdministradorSeguridad adminSeguridad;
    private Permiso permiso;
    private Estado estado;
    private ControladoraRegistroNotas contRegistroNotas;
    private LinkedList<MateriaCursada> listaMateriasCursadas;
    private boolean[] puedeEditarColumna = new boolean [] {
        false, false, false, false, false
    };
    /* Aquí se almacena la nota mínima de la materia cursada para la cual 
     * se está insertando o modificando un acta
     */
    private int notaMinima = 100;
    //Número de columna donde se muestra el estado de aprobación
    private final int columnaEstado = 4;
    //Número de columna donde se muestra la nota
    private final int columnaNota = 3;
    private final String stringAprobado = "Aprobado";
    private final String stringReprobado = "Reprobado";
    private final String stringSinCrear = "Sin Crear";

    private Acta acta;
    private InfoPeriodoActa infoPeriodoActa;
    private LinkedList<NotasPeriodoActa> listaNotasPeriodoActa;
    private LinkedList<GridRegistroNotasPeriodo> registroNotas;

    /** Creates new form PanelNivelSeccion */
    public PanelRegistroNotas() {
        initComponents();
    }

    public void inicializarRegistroNotas(){
        this.acta = new Acta();
        this.infoPeriodoActa = new InfoPeriodoActa();
        this.listaNotasPeriodoActa = new LinkedList<NotasPeriodoActa>();
        this.registroNotas = new LinkedList<GridRegistroNotasPeriodo>();
        this.adminSeguridad = AdministradorSeguridad.getInstancia();
        this.contRegistroNotas = new ControladoraRegistroNotas();
        this.estado = new Estado();
        this.permiso = this.adminSeguridad.getPermiso(UtilidadesCapaNegocios.moduloRegistroNotas);
        this.listaMateriasCursadas = new LinkedList<MateriaCursada>();
        this.habilitarAceptarCancelar(false, false);
        this.habilitarBotonesIME(permiso.isInsertar(), false, false);
        this.habilitarCampos(false);
        if(this.permiso.isConsultar()){
            this.limpiarComboBoxes();
            this.cargarComboBoxAños();
            this.cargarComboBoxNiveles();
        }
        
    }//fin de inicializarRegistroNotas

    private void habilitarBotonesIME(boolean insertar, boolean modificar, boolean eliminar){
        this.btnInsertar.setEnabled(insertar);
        this.btnModificar.setEnabled(modificar);
        this.btnEliminar.setEnabled(eliminar);
    }

    private void habilitarAceptarCancelar(boolean aceptar, boolean cancelar){
        this.btnAceptar.setEnabled(aceptar);
        this.btnCancelar.setEnabled(cancelar);
    }

    private void habilitarCampos(boolean habilitar){
        this.puedeEditarColumna[columnaNota] = habilitar;
    }

    private void habilitarCerrarActa(boolean habilitar){
        this.btnCerrarActa.setEnabled(habilitar);
    }

    private void mostrarAbrirActa(){
        this.btnCerrarActa.setText("Abrir Acta");
    }

    private void mostrarCerrarActa(){
        this.btnCerrarActa.setText("Cerrar Acta");
    }

    private void habilitarComboBoxes(boolean habilitar){
        this.cbAño.setEnabled(habilitar);
        this.cbNivel.setEnabled(habilitar);
        this.cbMateria.setEnabled(habilitar);
        this.cbSeccion.setEnabled(habilitar);
        this.cbPeriodo.setEnabled(habilitar);
    }

    /********************************************
     * CARGAR DATOS
     ********************************************/
    private void cargarComboBoxAños(){
        LinkedList<Anio> listaAños = this.contRegistroNotas.consultarAños();
        Iterator<Anio> iterador = listaAños.iterator();
        this.cbAño.addItem(new String(""));
        while(iterador.hasNext()){
            this.cbAño.addItem(Integer.toString(iterador.next().getAnio()));
        }
    }

    private void cargarComboBoxNiveles(){
        LinkedList<Nivel> listaNiveles = this.contRegistroNotas.consultarNiveles();
        Iterator<Nivel> iterador = listaNiveles.iterator();
        this.cbNivel.addItem(new String(""));
        while(iterador.hasNext()){
            this.cbNivel.addItem(Integer.toString(iterador.next().getNivel()));
        }
    }

    private void cargarComboBoxSecciones(){
        int año = Integer.valueOf(this.cbAño.getSelectedItem().toString());
        int nivel = Integer.valueOf(this.cbNivel.getSelectedItem().toString());
        LinkedList<Seccion> listaSecciones = this.contRegistroNotas.consultarSecciones(año, nivel);
        Iterator<Seccion> iterador = listaSecciones.iterator();
        this.cbSeccion.addItem(new String(""));
        while(iterador.hasNext()){
            this.cbSeccion.addItem(Integer.toString(iterador.next().getSeccion()));
        }
    }

    private void cargarComboBoxMaterias(){
        int año = Integer.valueOf(this.cbAño.getSelectedItem().toString());
        int nivel = Integer.valueOf(this.cbNivel.getSelectedItem().toString());
        listaMateriasCursadas = this.contRegistroNotas.consultarMaterias(año, nivel);
        Iterator<MateriaCursada> iterador = listaMateriasCursadas.iterator();
        this.cbMateria.addItem(new String(""));
        while(iterador.hasNext()){
            this.cbMateria.addItem(iterador.next().getNombre());
        }
    }

    private void cargarComboBoxPeriodos(){
        int indice = this.cbMateria.getSelectedIndex() - 1;
        int periodos = this.listaMateriasCursadas.get(indice).getCantidadPeriodos();
        this.cbPeriodo.addItem(new String(""));
        for(int i = 0; i < periodos; i++){
            cbPeriodo.addItem(Integer.toString(i+1));
        }
    }

    private void cargarCampos(LinkedList<GridRegistroNotasPeriodo> registros, Docente docente){
        this.txtDocente.setText(docente.getNombre() + " " + docente.getApellidos());
        if(registros.size() > 0 && estado.getEstadoActual() == Estado.CONSULTAR){
            Date fechaCreacion = registros.getFirst().getFecha_creacion();
            Date fechaUltModif = registros.getFirst().getUltima_mod();
            Date fechaCierre = registros.getFirst().getFecha_cierre();
            this.txtFechaCreacion.setText(!isFechaNula(fechaCreacion) ? this.obtenerStringFechaHora(fechaCreacion) : "");
            this.txtFechaModificacion.setText(!isFechaNula(fechaUltModif)? this.obtenerStringFechaHora(fechaUltModif) :"");
            this.txtFechaCierre.setText(!isFechaNula(fechaCierre)? this.obtenerStringFechaHora(fechaCierre):"");
            this.txtEstado.setText(isFechaNula(fechaCierre)? "Abierta" : "Cerrada");
            this.txtModificadaPor.setText(this.infoPeriodoActa.getModificadaPor());
        }
        if(registros.size() > 0 && estado.getEstadoActual() == Estado.INSERTAR){
            String fechaCreacion = this.obtenerStringFechaHora(new Date(Calendar.getInstance().getTimeInMillis()));
            this.txtFechaCreacion.setText(fechaCreacion);
        }
        if(this.estado.getEstadoActual() == Estado.INSERTAR && registroNotas.size() <= 0){
            String mensaje = "No existen estudiantes matriculados\n"+
                    "en la materia y sección del nivel y año elegidos";
            String estadoActa = "";
            if(this.existeActaPeriodo()){
                estadoActa = "Creada";
                mensaje = "El acta ya ha sido creada";
            }
            this.txtEstado.setText(estadoActa);
            JOptionPane.showMessageDialog(null, mensaje,"Atención", JOptionPane.WARNING_MESSAGE);
            this.limpiarCampos();
            this.limpiarGrid();
            this.cbPeriodo.setSelectedIndex(0);
        }

    }//fin de cargarCampos

    private boolean existeActaPeriodo(){
        Seccion seccion = this.obtenerSeccionPantalla();
        MateriaCursada materia = this.obtenerMateriaCursadaPantalla();
        int periodo = Integer.parseInt(cbPeriodo.getSelectedItem().toString());
        return this.contRegistroNotas.existeActaPeriodo(seccion, materia, periodo);
    }

    private String obtenerStringFechaHora(Date fecha){
        return UtilidadesCapaNegocios.obtenerStringFechaHora(fecha);
    }

    private void cargarRegistroNotas(Seccion seccion, int periodo, MateriaCursada materia, String cedulaDocente){
        boolean permisoIME = this.contRegistroNotas.puedeIME(this.adminSeguridad.getUsuario(),
                            this.adminSeguridad.getPerfil(), cedulaDocente);
        switch(estado.getEstadoActual()){
            case Estado.CONSULTAR:
                registroNotas = this.contRegistroNotas.consultarRegistroNotasPeriodo(seccion, periodo, materia);
                if( registroNotas.size() > 0 ){
                    if( isFechaNula(registroNotas.getFirst().getFecha_cierre()) ){
                        this.habilitarBotonesIME(permiso.isInsertar(), permisoIME, permisoIME);
                        this.habilitarCerrarActa(true);
                    }else{
                        //solo el administrador puede reabrir el acta
                        if(this.adminSeguridad.getPerfil().getNombre().equals(Perfil.PERFIL_ADMINISTRADOR)){
                            this.mostrarAbrirActa();
                            this.habilitarCerrarActa(true);
                        }
                    }//fin de else
                }//fin de if
            break;
            case Estado.INSERTAR:
                if(permisoIME){
                    registroNotas = this.contRegistroNotas.consultarRegistroNotasPeriodoNoCreados(seccion, periodo, materia);
                    if(registroNotas.size() > 0 ){
                        this.habilitarAceptarCancelar(permisoIME, true);
                    }
                    /*if(cedulaDocente.equals(UtilidadesCapaNegocios.CEDULA_INVALIDA) || cedulaDocente == null){
                        JOptionPane.showMessageDialog(null,
                                "Debe haber un docente asignado a impartir la materia y sección para crear el acta de notas",
                                "Atención", JOptionPane.WARNING_MESSAGE);
                    }//fin de else
                    */
                }
            break;
        }//fin de switch
        if(!permisoIME){
            JOptionPane.showMessageDialog(null, "Solamente el administrador del sistema o el docente que imparte esta materia en\n" +
                            "esta sección pueden insertar, modificar o eliminar las notas.", "ERROR", JOptionPane.ERROR_MESSAGE);
        }
    }//fin de cargarRegistroNotas

    private void cargarGrid(){
        this.limpiarGrid();
        this.limpiarCampos();
        MateriaCursada materia = obtenerMateriaCursadaPantalla();
        this.notaMinima = materia.getNotaMinima();
        int periodo = Integer.parseInt(cbPeriodo.getSelectedItem().toString());
        Seccion seccion = obtenerSeccionPantalla();
        Docente docente = this.contRegistroNotas.consultarDatosDocenteImparte(seccion, materia);
        this.cargarRegistroNotas(seccion, periodo, materia, docente.getCedula());
        this.gridNotas.getModel().removeTableModelListener(this);
        this.crearActaPeriodo(seccion, materia , docente.getCedula());
        this.llenarGrid();
        this.cargarCampos(registroNotas, docente);
        this.gridNotas.getModel().addTableModelListener(this);
    }//fin de cargarGrid

    private Seccion obtenerSeccionPantalla(){
        Seccion seccion = new Seccion();
        seccion.setAnio(Integer.parseInt(cbAño.getSelectedItem().toString()));
        seccion.setNivel(Integer.parseInt(cbNivel.getSelectedItem().toString()));
        seccion.setSeccion(Integer.parseInt(cbSeccion.getSelectedItem().toString()));
        return seccion;
    }

    private MateriaCursada obtenerMateriaCursadaPantalla(){
        int materiaSeleccionada = cbMateria.getSelectedIndex() - 1;
        MateriaCursada materia = this.listaMateriasCursadas.get(materiaSeleccionada);
        return materia;
    }


    private void llenarGrid(){
        Iterator<GridRegistroNotasPeriodo> iterador = registroNotas.iterator();
        while(iterador.hasNext()){
            GridRegistroNotasPeriodo registro = iterador.next();
            Object arregloDatos[] = new Object[5];
            arregloDatos[0] = registro.getCedula();
            arregloDatos[1] = registro.getNombre();
            arregloDatos[2] = registro.getApellidos();
            arregloDatos[3] = registro.getNota_periodo();
            if(estado.getEstadoActual() == Estado.CONSULTAR){
                arregloDatos[this.columnaEstado] = registro.isAprobado()? this.stringAprobado : this.stringReprobado;
            }
            if(estado.getEstadoActual() == Estado.INSERTAR){
                arregloDatos[this.columnaEstado] = "Sin aprobar";
            }
            ((DefaultTableModel)this.gridNotas.getModel()).addRow(arregloDatos);
        }
    }//fin de llenarGrid

    private void crearActaPeriodo(Seccion seccion, MateriaCursada materia, String cedulaDocente){
        this.acta.setAnio(seccion.getAnio());
        this.acta.setNivel(seccion.getNivel());
        this.acta.setSeccion(seccion.getSeccion());
        this.acta.setId_materia(materia.getIdMateria());
        this.acta.setId_materia_cursada(materia.getIdMateriaCursada());
        this.acta.setCedula(cedulaDocente);
        this.infoPeriodoActa.setPeriodo(Integer.valueOf(this.cbPeriodo.getSelectedItem().toString()));
        this.listaNotasPeriodoActa.clear();
        Iterator<GridRegistroNotasPeriodo> iterador = registroNotas.iterator();
        while (iterador.hasNext()){
            GridRegistroNotasPeriodo filaNotasGrid = iterador.next();
            NotasPeriodoActa notaPeriodoActa = new NotasPeriodoActa();
            notaPeriodoActa.setCedula(filaNotasGrid.getCedula());
            notaPeriodoActa.setAprobado(filaNotasGrid.isAprobado());
            notaPeriodoActa.setId_info_periodo_acta(filaNotasGrid.getId_info_periodo_acta());
            notaPeriodoActa.setId_notas_periodo_acta(filaNotasGrid.getId_notas_periodo_acta());
            notaPeriodoActa.setNota(filaNotasGrid.getNota_periodo());
            this.listaNotasPeriodoActa.add(notaPeriodoActa);
        }//fin de while
        if(estado.getEstadoActual() == Estado.INSERTAR){
            this.acta.setFecha_creacion(new Date(System.currentTimeMillis()));
            if ( cedulaDocente.equals(UtilidadesCapaNegocios.CEDULA_INVALIDA)){
                JOptionPane.showMessageDialog(null, "No existe un profesor para la materia y sección elegidas\n" +
                        "o ocurrió un error al consultarlo de la base de datos.\n" +
                        "Por favor verifique que el profesor existe e intente de nuevo.", "ERROR", JOptionPane.ERROR_MESSAGE);
            }
        }//fin de if
        if(estado.getEstadoActual() == Estado.CONSULTAR && registroNotas.size() > 0){
            GridRegistroNotasPeriodo filaRegistroNotas = registroNotas.getFirst();
            this.acta.setId_acta(filaRegistroNotas.getId_acta());
            this.acta.setFecha_creacion(filaRegistroNotas.getFecha_creacion());
            this.infoPeriodoActa.setId_info_periodo_acta(filaRegistroNotas.getId_info_periodo_acta());
            this.infoPeriodoActa.setFechaCierre(filaRegistroNotas.getFecha_cierre());
            this.infoPeriodoActa.setUltima_mod(filaRegistroNotas.getUltima_mod());
            this.infoPeriodoActa.setId_acta(filaRegistroNotas.getId_acta());
            this.infoPeriodoActa.setModificadaPor(filaRegistroNotas.getModificadaPor());
        }//fin de if
    }//fin de crearActaPeriodo

    private boolean isFechaNula(Date fecha){
        return UtilidadesCapaNegocios.esFechaNula(fecha);
    }

    /********************************************
     * ACCIONES
     ********************************************/

    private void insertarRegistroNotas(){
        int resultado = UtilidadesCapaNegocios.QUERY_ERROR;
        this.infoPeriodoActa.setModificadaPor(this.contRegistroNotas.consultarNombreRealUsuarioActual());
        if(!existeActa()){
            resultado = this.contRegistroNotas.insertarRegistroNotas(acta, infoPeriodoActa, listaNotasPeriodoActa);
        }else{
            Acta actaNotas = contRegistroNotas.consultarActa(this.obtenerSeccionPantalla(), this.obtenerMateriaCursadaPantalla());
            this.infoPeriodoActa.setId_acta(actaNotas.getId_acta());
            resultado = this.contRegistroNotas.insertarRegistroNotas(infoPeriodoActa, listaNotasPeriodoActa);
        }
        switch(resultado){
            case UtilidadesCapaNegocios.QUERY_OK:
                this.gridNotas.getSelectionModel().clearSelection();
                JOptionPane.showMessageDialog(null, "Las notas fueron insertadas exitosamente");
                break;
            case UtilidadesCapaNegocios.QUERY_HALF_OK:
                JOptionPane.showMessageDialog(null, "Solo una parte de las notas ha podido ser insertada en el sistema.\n" +
                        "Por favor elimine este conjunto de notas e intente ingresarlas de nuevo al sistema");
                break;
            case UtilidadesCapaNegocios.QUERY_ERROR:
                String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloRegistroNotas, UtilidadesCapaNegocios.opInsertar);
                JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
                break;
            default:
                break;
        }//fin de switch
    }//fin de insertarRegistroNotas

    private int modificarRegistroNotas(){
        int resultado = UtilidadesCapaNegocios.QUERY_ERROR;
        this.infoPeriodoActa.setModificadaPor(this.contRegistroNotas.consultarNombreRealUsuarioActual());
        resultado = this.contRegistroNotas.modificarRegistroNotas(infoPeriodoActa, listaNotasPeriodoActa);

        switch(resultado){
            case UtilidadesCapaNegocios.QUERY_OK:
                this.gridNotas.getSelectionModel().clearSelection();
                JOptionPane.showMessageDialog(null, "Las notas fueron modificadas exitosamente");
                break;
            case UtilidadesCapaNegocios.QUERY_HALF_OK:
                JOptionPane.showMessageDialog(null, "Solo una parte de las notas ha podido ser modificada en el sistema.\n" +
                        "Por favor revise y modifique de nuevo las notas que no fueron actualizadas");
                break;
            case UtilidadesCapaNegocios.QUERY_ERROR:
                String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloRegistroNotas, UtilidadesCapaNegocios.opModificar);
                JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
                break;
            default:
                break;
        }//fin de switch
        return resultado;
    }//fin de modificarRegistroNotas

    private void eliminarRegistroNotas(){
        int resultado = this.contRegistroNotas.eliminarRegistroNotas(infoPeriodoActa);
        if(resultado == UtilidadesCapaNegocios.QUERY_OK){
            JOptionPane.showMessageDialog(null, "El registro de notas fue eliminado exitosamente");
            this.volverConsultar();
        }else{
            String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloRegistroNotas, UtilidadesCapaNegocios.opEliminar);
            JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
        }
    }//fin de eliminarRegistroNotas

    private boolean existeActa(){
        LinkedList<LlaveValor> listaLlaves = new LinkedList<LlaveValor>();
        listaLlaves.add(new LlaveValor(Acta.anioNC, this.acta.getAnio()));
        listaLlaves.add(new LlaveValor(Acta.nivelNC, this.acta.getNivel()));
        listaLlaves.add(new LlaveValor(Acta.seccionNC, this.acta.getSeccion()));
        listaLlaves.add(new LlaveValor(Acta.id_materiaNC, this.acta.getId_materia()));
        listaLlaves.add(new LlaveValor(Acta.id_materia_cursadaNC, this.acta.getId_materia_cursada()));
        
        return UtilidadesCapaNegocios.existenLlaves(Acta.nombreTablaNC, listaLlaves);
    }//fin de existeActa

    private void volverConsultar(){
        int estadoActual = this.estado.getEstadoActual();
        this.estado.setEstadoActual(Estado.CONSULTAR);
        this.habilitarBotonesIME(permiso.isInsertar(), false, false);
        this.habilitarAceptarCancelar(false, false);
        this.habilitarCampos(false);
        this.mostrarCerrarActa();
        this.habilitarCerrarActa(false);
        //Con esto lo que hacemos es refrescar los datos y que el usuario
        //los vea actualizados.
        if(estadoActual == Estado.MODIFICAR){
            this.cargarGrid();
        }else{
            this.limpiarComboBoxes();
            this.limpiarCampos();
            this.limpiarGrid();
            this.cargarComboBoxAños();
            this.cargarComboBoxNiveles();
        }
        this.habilitarComboBoxes(true);
        
    }//fin de volverConsultar
    
    /********************************************
     * LIMPIAR
     ********************************************/

    private void limpiarCampos(){
        this.txtDocente.setText("");
        this.txtModificadaPor.setText("");
        this.txtFechaCreacion.setText("");
        this.txtFechaModificacion.setText("");
        this.txtFechaCierre.setText("");
        String estadoActa = (estado.getEstadoActual()==Estado.CONSULTAR)? "": this.stringSinCrear;
        this.txtEstado.setText(estadoActa);
    }
    
    private void limpiarComboBoxes(){
        this.limpiarAños();
        this.limpiarNiveles();
        this.limpiarMaterias();
        this.limpiarSecciones();
        this.limpiarPeriodos();
    }

    private void limpiarAños(){
        ((DefaultComboBoxModel)this.cbAño.getModel()).removeAllElements();
    }

    private void limpiarNiveles(){
        ((DefaultComboBoxModel)this.cbNivel.getModel()).removeAllElements();
    }

    private void limpiarMaterias(){
        this.notaMinima = 100;
        ((DefaultComboBoxModel)this.cbMateria.getModel()).removeAllElements();
        this.listaMateriasCursadas.clear();
    }

    private void limpiarSecciones(){
        ((DefaultComboBoxModel)this.cbSeccion.getModel()).removeAllElements();
    }
    
    private void limpiarPeriodos(){
        ((DefaultComboBoxModel)this.cbPeriodo.getModel()).removeAllElements();
    }

    private void limpiarGrid(){
        ((DefaultTableModel)this.gridNotas.getModel()).setRowCount(0);
        this.registroNotas.clear();
        this.mostrarCerrarActa();
        this.habilitarCerrarActa(false);
    }

    /********************************************
     * Validar y verificar datos
     ********************************************/

    private boolean validarDatos(){
        boolean resultado = true;
        for(int fila = 0; fila < this.gridNotas.getModel().getRowCount() && resultado; fila++){
            double nota = Double.valueOf(this.gridNotas.getValueAt(fila, this.columnaNota).toString());
            if(nota < 0 || nota > 100){
                resultado = false;
            }
        }
        if(!resultado){
            JOptionPane.showMessageDialog(null, "Todas las notas deben estar en el rango de 0 a 100", "ERROR", JOptionPane.WARNING_MESSAGE);
        }
        if(this.acta.getCedula().equals(UtilidadesCapaNegocios.CEDULA_INVALIDA)){
            resultado = false;
            JOptionPane.showMessageDialog(null, "No existe un profesor para la materia y sección elegidas\n" +
                    "o ocurrió un error al consultarlo de la base de datos.\n" +
                    "Por favor verifique que el profesor existe e intente de nuevo.", "ERROR", JOptionPane.ERROR_MESSAGE);
        }
        return resultado;
    }//fin de validarDatos

    /********************************************
     * EVENTOS
     ********************************************/
    public void actionPerformed(ActionEvent evento){
        JComboBox fuente = (JComboBox) evento.getSource();
        if(fuente.equals(this.cbAño) || fuente.equals(this.cbNivel)){
            if(cbAño.getSelectedIndex() > 0 && cbNivel.getSelectedIndex() > 0){
                this.limpiarMaterias();
                this.limpiarSecciones();
                this.limpiarPeriodos();
                this.cargarComboBoxMaterias();
                this.cargarComboBoxSecciones();
            }
        }

        if(fuente.equals(this.cbMateria) && cbMateria.getSelectedIndex() > 0){
            this.limpiarPeriodos();
            this.cargarComboBoxPeriodos();
        }

        //Se habilita el botón del acta anual si ya se seleccionó todo excepto el período
        this.btnActaAnual.setEnabled(cbAño.getSelectedIndex() > 0 && cbNivel.getSelectedIndex() > 0
                && cbMateria.getSelectedIndex() > 0 && cbSeccion.getSelectedIndex() > 0);

        this.verificarCargarGrid();
        
    }//fin de actionPerformed

    private void verificarCargarGrid(){
        if(cbAño.getSelectedIndex() > 0 && cbNivel.getSelectedIndex() > 0
                && cbMateria.getSelectedIndex() > 0 && cbSeccion.getSelectedIndex() > 0
                && cbPeriodo.getSelectedIndex() > 0){
            this.cargarGrid();
        }else{
            this.limpiarCampos();
            this.limpiarGrid();
        }
    }

    public void tableChanged(TableModelEvent evento){
        if( evento.getType() == TableModelEvent.UPDATE){
            this.gridNotas.getModel().removeTableModelListener(this);
            int fila = this.gridNotas.getSelectedRow();
            if( fila >= 0 && fila < this.gridNotas.getRowCount() ){
                DefaultTableModel modelo = (DefaultTableModel)this.gridNotas.getModel();
                double notaActual = Double.valueOf(modelo.getValueAt(fila, this.columnaNota).toString());
                if(notaActual < 0 || notaActual > 100){
                    //TODO futuro http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#colorRenderer
                    JOptionPane.showMessageDialog(this, "La nota debe estar en el rango de 0-100", "Error", JOptionPane.ERROR_MESSAGE);
                    modelo.setValueAt(0, fila, this.columnaNota);
                }else{
                    String estadoAprobacion = notaActual >= this.notaMinima ? this.stringAprobado : this.stringReprobado;
                    modelo.setValueAt(estadoAprobacion, fila, this.columnaEstado);
                    this.gridNotas.setModel(modelo);
                    if(fila < this.listaNotasPeriodoActa.size()){
                        this.listaNotasPeriodoActa.get(fila).setNota(notaActual);
                        this.listaNotasPeriodoActa.get(fila).setAprobado( notaActual >= this.notaMinima);
                        //TODO para el modificar aprovechar el atributo de isModificado de las notas
                        this.listaNotasPeriodoActa.get(fila).setModificado(true);
                        this.infoPeriodoActa.setUltima_mod(new Date(System.currentTimeMillis()));
                    }//fin de if
                }
            }
            this.gridNotas.getModel().addTableModelListener(this);
        }
    }//fin de tableChanged

    /**
     ** Muestra un mensaje de confirmación para que el usuario decida si realmente
     ** quiere llevar a cabo una operación
     ** @param operacion Código de operación realizada, tomada de UtilidadesCapaNegocios
     ** @param titulo Título a mostrar en el cuadro de confirmación
     ** @return Confirmación: true si el usuario acepta, false en otro caso.
     **/
    private boolean mostrarMensajeConfirmacion(int operacion, String titulo){
        boolean resultado = true;
        String mensaje = UtilidadesCapaNegocios.getMensajeConfirmacion(UtilidadesCapaNegocios.moduloRegistroNotas, operacion);
        int respuesta = JOptionPane.showConfirmDialog(null, mensaje,titulo ,JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE);
        resultado = respuesta == JOptionPane.OK_OPTION;
        return resultado;
    }//fin de mostrarMensajeConfirmacion

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        btnInsertar = new javax.swing.JButton();
        btnModificar = new javax.swing.JButton();
        btnEliminar = new javax.swing.JButton();
        scrollTablaNotas = new javax.swing.JScrollPane();
        gridNotas = new javax.swing.JTable();
        lbPeriodo = new javax.swing.JLabel();
        lbAño = new javax.swing.JLabel();
        cbAño = new javax.swing.JComboBox();
        cbPeriodo = new javax.swing.JComboBox();
        lbNivel = new javax.swing.JLabel();
        cbNivel = new javax.swing.JComboBox();
        lbMateria = new javax.swing.JLabel();
        cbMateria = new javax.swing.JComboBox();
        lbSeccion = new javax.swing.JLabel();
        cbSeccion = new javax.swing.JComboBox();
        lbFechaCreacion = new javax.swing.JLabel();
        txtFechaCreacion = new javax.swing.JTextField();
        lbFechaModificacion = new javax.swing.JLabel();
        txtFechaModificacion = new javax.swing.JTextField();
        lbFechaCierre = new javax.swing.JLabel();
        txtFechaCierre = new javax.swing.JTextField();
        lbEstado = new javax.swing.JLabel();
        txtEstado = new javax.swing.JTextField();
        btnCancelar = new javax.swing.JButton();
        btnAceptar = new javax.swing.JButton();
        btnCerrarActa = new javax.swing.JButton();
        lbModificadadPor = new javax.swing.JLabel();
        txtModificadaPor = new javax.swing.JTextField();
        lbDocente = new javax.swing.JLabel();
        txtDocente = new javax.swing.JTextField();
        btnActaAnual = new javax.swing.JButton();

        setMaximumSize(new java.awt.Dimension(700, 600));
        setMinimumSize(new java.awt.Dimension(700, 600));
        setName("Form"); // NOI18N
        setPreferredSize(new java.awt.Dimension(700, 600));
        setRequestFocusEnabled(false);

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(adsec.presentacion.LiceoEscazuApp.class).getContext().getActionMap(PanelRegistroNotas.class, this);
        btnInsertar.setAction(actionMap.get("insertandoRegistroNotas")); // NOI18N
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(adsec.presentacion.LiceoEscazuApp.class).getContext().getResourceMap(PanelRegistroNotas.class);
        btnInsertar.setText(resourceMap.getString("btnInsertar.text")); // NOI18N
        btnInsertar.setName("btnInsertar"); // NOI18N

        btnModificar.setAction(actionMap.get("modificandoRegistroNotas")); // NOI18N
        btnModificar.setText(resourceMap.getString("btnModificar.text")); // NOI18N
        btnModificar.setName("btnModificar"); // NOI18N

        btnEliminar.setAction(actionMap.get("eliminandoRegistroNotas")); // NOI18N
        btnEliminar.setText(resourceMap.getString("btnEliminar.text")); // NOI18N
        btnEliminar.setName("btnEliminar"); // NOI18N

        scrollTablaNotas.setName("scrollTablaNotas"); // NOI18N

        gridNotas.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
            },
            new String [] {
                "Cédula", "Nombre", "Apellidos", "Nota Obtenida", "Estado"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Double.class, java.lang.Object.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, true, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return puedeEditarColumna [columnIndex];
            }
        });
        gridNotas.setName("gridNotas"); // NOI18N
        scrollTablaNotas.setViewportView(gridNotas);
        gridNotas.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        gridNotas.getModel().addTableModelListener(this);

        lbPeriodo.setText(resourceMap.getString("lbPeriodo.text")); // NOI18N
        lbPeriodo.setName("lbPeriodo"); // NOI18N

        lbAño.setText(resourceMap.getString("lbAño.text")); // NOI18N
        lbAño.setName("lbAño"); // NOI18N

        cbAño.setName("cbAño"); // NOI18N

        cbPeriodo.setName("cbPeriodo"); // NOI18N

        lbNivel.setText(resourceMap.getString("lbNivel.text")); // NOI18N
        lbNivel.setName("lbNivel"); // NOI18N

        cbNivel.setName("cbNivel"); // NOI18N

        lbMateria.setText(resourceMap.getString("lbMateria.text")); // NOI18N
        lbMateria.setName("lbMateria"); // NOI18N

        cbMateria.setName("cbMateria"); // NOI18N

        lbSeccion.setText(resourceMap.getString("lbSeccion.text")); // NOI18N
        lbSeccion.setName("lbSeccion"); // NOI18N

        cbSeccion.setName("cbSeccion"); // NOI18N

        lbFechaCreacion.setText(resourceMap.getString("lbFechaCreacion.text")); // NOI18N
        lbFechaCreacion.setName("lbFechaCreacion"); // NOI18N

        txtFechaCreacion.setEditable(false);
        txtFechaCreacion.setText(resourceMap.getString("txtFechaCreacion.text")); // NOI18N
        txtFechaCreacion.setName("txtFechaCreacion"); // NOI18N

        lbFechaModificacion.setText(resourceMap.getString("lbFechaModificacion.text")); // NOI18N
        lbFechaModificacion.setName("lbFechaModificacion"); // NOI18N

        txtFechaModificacion.setEditable(false);
        txtFechaModificacion.setText(resourceMap.getString("txtFechaModificacion.text")); // NOI18N
        txtFechaModificacion.setName("txtFechaModificacion"); // NOI18N

        lbFechaCierre.setText(resourceMap.getString("lbFechaCierre.text")); // NOI18N
        lbFechaCierre.setName("lbFechaCierre"); // NOI18N

        txtFechaCierre.setEditable(false);
        txtFechaCierre.setText(resourceMap.getString("txtFechaCierre.text")); // NOI18N
        txtFechaCierre.setName("txtFechaCierre"); // NOI18N

        lbEstado.setText(resourceMap.getString("lbEstado.text")); // NOI18N
        lbEstado.setName("lbEstado"); // NOI18N

        txtEstado.setEditable(false);
        txtEstado.setText(resourceMap.getString("txtEstado.text")); // NOI18N
        txtEstado.setName("txtEstado"); // NOI18N

        btnCancelar.setAction(actionMap.get("accionCancelar")); // NOI18N
        btnCancelar.setText(resourceMap.getString("btnCancelar.text")); // NOI18N
        btnCancelar.setName("btnCancelar"); // NOI18N

        btnAceptar.setAction(actionMap.get("accionAceptar")); // NOI18N
        btnAceptar.setText(resourceMap.getString("btnAceptar.text")); // NOI18N
        btnAceptar.setName("btnAceptar"); // NOI18N

        btnCerrarActa.setAction(actionMap.get("cerrarActaPeriodo")); // NOI18N
        btnCerrarActa.setName("btnCerrarActa"); // NOI18N

        lbModificadadPor.setText(resourceMap.getString("lbModificadadPor.text")); // NOI18N
        lbModificadadPor.setName("lbModificadadPor"); // NOI18N

        txtModificadaPor.setEditable(false);
        txtModificadaPor.setText(resourceMap.getString("txtModificadaPor.text")); // NOI18N
        txtModificadaPor.setName("txtModificadaPor"); // NOI18N

        lbDocente.setText(resourceMap.getString("lbDocente.text")); // NOI18N
        lbDocente.setName("lbDocente"); // NOI18N

        txtDocente.setEditable(false);
        txtDocente.setText(resourceMap.getString("txtDocente.text")); // NOI18N
        txtDocente.setName("txtDocente"); // NOI18N

        btnActaAnual.setAction(actionMap.get("generarActaAnual")); // NOI18N
        btnActaAnual.setText(resourceMap.getString("btnActaAnual.text")); // NOI18N
        btnActaAnual.setToolTipText(resourceMap.getString("btnActaAnual.toolTipText")); // NOI18N
        btnActaAnual.setName("btnActaAnual"); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(lbModificadadPor, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(lbEstado, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(lbDocente, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(lbPeriodo, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(lbSeccion, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(lbMateria, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(lbNivel, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(lbAño, javax.swing.GroupLayout.Alignment.TRAILING))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(cbMateria, javax.swing.GroupLayout.PREFERRED_SIZE, 233, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                .addComponent(cbNivel, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(cbAño, javax.swing.GroupLayout.Alignment.LEADING, 0, 65, Short.MAX_VALUE))
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                .addComponent(cbPeriodo, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(cbSeccion, javax.swing.GroupLayout.Alignment.LEADING, 0, 65, Short.MAX_VALUE))
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addComponent(txtModificadaPor)
                                    .addComponent(txtDocente, javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                        .addComponent(txtEstado, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addGap(12, 12, 12)
                                        .addComponent(lbFechaCreacion)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(txtFechaCreacion, javax.swing.GroupLayout.PREFERRED_SIZE, 112, javax.swing.GroupLayout.PREFERRED_SIZE)))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(lbFechaModificacion)
                                    .addComponent(lbFechaCierre))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(txtFechaCierre)
                                    .addComponent(txtFechaModificacion, javax.swing.GroupLayout.DEFAULT_SIZE, 115, Short.MAX_VALUE)))))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(btnInsertar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(btnModificar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(btnEliminar))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGap(313, 313, 313)
                        .addComponent(btnActaAnual)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnCerrarActa)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnAceptar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnCancelar))
                    .addComponent(scrollTablaNotas, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 676, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnEliminar)
                    .addComponent(btnModificar)
                    .addComponent(btnInsertar))
                .addGap(30, 30, 30)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(lbAño)
                    .addComponent(cbAño, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(lbNivel)
                    .addComponent(cbNivel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(lbMateria)
                    .addComponent(cbMateria, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(lbSeccion)
                    .addComponent(cbSeccion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(lbPeriodo)
                    .addComponent(cbPeriodo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(lbDocente)
                    .addComponent(txtDocente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(lbEstado)
                    .addComponent(txtEstado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbFechaCreacion)
                    .addComponent(txtFechaCreacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbFechaCierre)
                    .addComponent(txtFechaCierre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(lbModificadadPor)
                    .addComponent(txtModificadaPor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbFechaModificacion)
                    .addComponent(txtFechaModificacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addComponent(scrollTablaNotas, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnCancelar)
                    .addComponent(btnAceptar)
                    .addComponent(btnCerrarActa)
                    .addComponent(btnActaAnual))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        cbAño.addActionListener(this);
        cbPeriodo.addActionListener(this);
        cbNivel.addActionListener(this);
        cbMateria.addActionListener(this);
        cbSeccion.addActionListener(this);
    }// </editor-fold>//GEN-END:initComponents


    @Action
    public void insertandoRegistroNotas() {
        this.estado.setEstadoActual(Estado.INSERTAR);
        this.habilitarAceptarCancelar(false, true);
        this.habilitarBotonesIME(false, false, false);
        this.habilitarCerrarActa(false);
        //this.limpiarComboBoxes();
        this.verificarCargarGrid();
        this.habilitarCampos(true);
    }

    @Action
    public void modificandoRegistroNotas() {
        this.estado.setEstadoActual(Estado.MODIFICAR);
        this.habilitarAceptarCancelar(true, true);
        this.habilitarBotonesIME(false, false, false);
        this.habilitarComboBoxes(false);
        this.habilitarCampos(true);
    }

    @Action
    public void accionAceptar() {
        Animador.animar();
        switch(estado.getEstadoActual()){
            case Estado.INSERTAR:
                if(mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opInsertar, "INSERTAR") ){
                    if( validarDatos()){
                        this.insertarRegistroNotas();
                        this.volverConsultar();
                    }
                }
            break;
            case Estado.MODIFICAR:
                if(mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opModificar, "MODIFICAR") ){
                    if(validarDatos()){
                        this.modificarRegistroNotas();
                        this.volverConsultar();
                    }
                }
            break;
        }
        Animador.detenerAnimacion();
    }//fin de accionAceptar

    @Action
    public void accionCancelar() {
        this.limpiarCampos();
        // si es modificar no limpie los comboBox, porque deben quedar ahi para cargar el grid y campos.
        if(estado.getEstadoActual() != Estado.MODIFICAR){
            this.limpiarComboBoxes();
        }
        this.limpiarGrid();
        this.volverConsultar();
    }//fin de accionCancelar

    @Action
    public void eliminandoRegistroNotas() {
        Animador.animar();
        if(this.mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opEliminar, "ELIMINAR")){
            this.eliminarRegistroNotas();
        }
        Animador.detenerAnimacion();
    }//fin de eliminandoRegistroNotas

    @Action
    public void generarActaAnual() {
        //Se verifica que el acta tenga todas las acta de período cerradas
        Acta actaNotas = contRegistroNotas.consultarActa(this.obtenerSeccionPantalla(), this.obtenerMateriaCursadaPantalla());
        if((actaNotas != null) && contRegistroNotas.cumpleRequisitosParaActaAnual(actaNotas.getId_acta(), this.cbPeriodo.getItemCount() -1)){
            DialogoRegistroNotasAnual dialogoActaAnual = new DialogoRegistroNotasAnual(Animador.getInstancia().getVista().getFrame(),true);
            MateriaCursada materia = this.listaMateriasCursadas.get(cbMateria.getSelectedIndex() - 1);
            PanelRegistroNotasAnual panelAnual = dialogoActaAnual.getPanelRegistroNotasAnual();
            panelAnual.inicializarDatos(actaNotas, materia);
            dialogoActaAnual.setVisible(true);
        }else{
            JOptionPane.showMessageDialog(null, "Las actas de cada período deben estar cerradas para poder generar el acta anual",
                    "Atención", JOptionPane.WARNING_MESSAGE);
        }
    }

    @Action
    public void cerrarActaPeriodo() {
        int operacion = UtilidadesCapaNegocios.opCerrarActa;
        String accion = "Cerrar";
        if(txtEstado.getText().equals("Cerrada")){
            operacion = UtilidadesCapaNegocios.opAbrirActa;
            accion = "Abrir";
        }     
        boolean resultado = this.mostrarMensajeConfirmacion(operacion, accion + " acta");
        if(resultado){
            if(estado.getEstadoActual() == Estado.MODIFICAR){
                resultado = this.modificarRegistroNotas() == UtilidadesCapaNegocios.QUERY_OK;
            }
            if(resultado){
                int resultadoCierreAbrir = contRegistroNotas.cerrarAbrirActaPeriodo(infoPeriodoActa.getId_info_periodo_acta(), operacion);
                if(UtilidadesCapaNegocios.QUERY_OK == resultadoCierreAbrir){
                    //Se coloca el estado el estado actual modificar para refrescar los datos.
                    this.estado.setEstadoActual(Estado.MODIFICAR);
                    this.volverConsultar();
                }else{
                    JOptionPane.showMessageDialog(null, "Ocurrió un problema al " + accion + " el acta por favor intente de nuevo","ERROR: Cerrar Acta", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAceptar;
    private javax.swing.JButton btnActaAnual;
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnCerrarActa;
    private javax.swing.JButton btnEliminar;
    private javax.swing.JButton btnInsertar;
    private javax.swing.JButton btnModificar;
    private javax.swing.JComboBox cbAño;
    private javax.swing.JComboBox cbMateria;
    private javax.swing.JComboBox cbNivel;
    private javax.swing.JComboBox cbPeriodo;
    private javax.swing.JComboBox cbSeccion;
    private javax.swing.JTable gridNotas;
    private javax.swing.JLabel lbAño;
    private javax.swing.JLabel lbDocente;
    private javax.swing.JLabel lbEstado;
    private javax.swing.JLabel lbFechaCierre;
    private javax.swing.JLabel lbFechaCreacion;
    private javax.swing.JLabel lbFechaModificacion;
    private javax.swing.JLabel lbMateria;
    private javax.swing.JLabel lbModificadadPor;
    private javax.swing.JLabel lbNivel;
    private javax.swing.JLabel lbPeriodo;
    private javax.swing.JLabel lbSeccion;
    private javax.swing.JScrollPane scrollTablaNotas;
    private javax.swing.JTextField txtDocente;
    private javax.swing.JTextField txtEstado;
    private javax.swing.JTextField txtFechaCierre;
    private javax.swing.JTextField txtFechaCreacion;
    private javax.swing.JTextField txtFechaModificacion;
    private javax.swing.JTextField txtModificadaPor;
    // End of variables declaration//GEN-END:variables

}
